package org.example;

public class 稀疏数组 {
    public static void main(String[] args) {
        // 创建一个原始的二维数组 11 * 11
        // 1. (0): 表示没有棋子; (1): 表示黑子; (0): 表示蓝子;
        int arr0[][] = new int[11][11];
        arr0[1][2] = 1;
        arr0[2][3] = 2;

        // 输出原始的二维数组
        System.out.println("原始二维数组如下: ");
        for (int[] row : arr0) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        // 1. 遍历原始的二维数组，得到有效数据的行、列、数据信息
        int rows = 0;
        int cols = 0;
        int sum = 0;
        for (int[] row : arr0) {
            rows++;
            cols = 0;
            for (int data : row) {
                cols++;
                if(data != 0) {
                    sum ++;
                }
            }
        }

        System.out.printf("rows = %d, cols = %d, sum = %d", rows, cols, sum);
        System.out.println();

        // 2. 根据 sum 就可以创建稀疏数组arr int[sum + 1][3];
        int res[][] = new int[sum + 1][3];

        // 稀疏数组第一行记录原始数组的行数、列数、有效数据个数
        int count = 0;  // count 用于记录第几个有效数据
        res[0][0] = rows;
        res[0][1] = cols;
        res[0][2] = sum;
        System.out.println("稀疏数组信息如下: ");
        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < cols; j++) {
                if(arr0[i][j] != 0) {
                    count++;
                    res[count][0] = i;
                    res[count][1] = j;
                    res[count][2] = arr0[i][j];
                }
            }
        }

        // 输出稀疏数组
        for (int i =0; i < res.length; i++) {
            System.out.printf("i = %d \t row = %d \t col = %d \t data = %d", i, res[i][0], res[i][1], res[i][2]);
            System.out.println();
        }

        // 将稀疏数组恢复成原始数组
        // 1. 先读取稀疏数组的第一行，根据第一行的行、列总数创建原始的二维数组
        int arrc[][] = new int[res[0][0]][res[0][1]];
        // 2. 再读取稀疏数组的后几行数据，并赋值给原始二维数组即可
        for(int i =1; i < res.length; i++) {
            arrc[res[i][0]][res[i][1]] = res[i][2];
        }

        // 输出恢复后的二维数组
        System.out.println("恢复后的二维数组如下: ");
        for (int[] row : arrc) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}
